package com.biao.juc;

import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.ReentrantLock;

public class Demo06_aqs {
    // 查看 ReentrantLock 源码
    /*
public class ReentrantLock implements Lock, java.io.Serializable {
    private static final long serialVersionUID = 7373984872572414699L;

    private final ReentrantLock.Sync sync;  // 使用了Sync 这么一个内部类

    // Sync 继承了AQS
    abstract static class Sync extends AbstractQueuedSynchronizer {
        。。。。。。
     */


    /*
        AQS原理：
        多线程情况下去抢锁，如果抢到锁，会改变锁的状态state从0改为1（CAS操作），
        其他线程判断锁是否被其他线程持有，把没有获取到锁的线程放到一个集合中，这个集合是双向链表的结构
        持有锁的线程执行结束修改锁状态为0（没有持有状态），然后唤醒其他线程参与抢锁

        锁的状态有时可能会出现大于1的时候，可能是有重入锁的场景

        AQS原理可以查看图片 aqs.png
     */
}
